package com.udc.medLine.carrinho;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.udc.medLine.entity.Cliente;
import com.udc.medLine.entity.Conveniencia;
import com.udc.medLine.entity.Item;
import com.udc.medLine.entity.ItemVenda;
import com.udc.medLine.entity.Medicamento;
import com.udc.medLine.entity.Pessoa;
import com.udc.medLine.entity.Produto;
import com.udc.medLine.entity.Status;
import com.udc.medLine.entity.TipoItem;
import com.udc.medLine.entity.Venda;
import com.udc.medLine.transaction.TransactionConveniencia;
import com.udc.medLine.transaction.TransactionMedicamento;
import com.udc.medLine.transaction.TransactionTipoItem;
import com.udc.medLine.transaction.TransactionVenda;
import com.udc.medLine.utils.CarrinhoUtils;

public class Carrinho {

	private List<ItemVenda> itens;

	/**
	 * @return the valorTotal
	 */
	public float getValorTotal() {

		float valorTotal = 0;

		for (ItemVenda itemVenda : this.getItens()) {

			valorTotal += itemVenda.getValorTotal(itemVenda.getItem().getTipoItem().getNome());
		}

		return valorTotal;
	}

	public int getTotalItens() {

		int total = 0;

		for (ItemVenda itemVenda : this.getItens()) {

			total += itemVenda.getQuantidade();
		}

		return total;
	}

	/**
	 * @return the itens
	 */
	public List<ItemVenda> getItens() {

		if (this.itens == null) {

			this.itens = new ArrayList<ItemVenda>();
		}

		return itens;
	}

	/**
	 * @param itens
	 *            the itens to set
	 */
	public void setItens(List<ItemVenda> itens) {
		this.itens = itens;
	}

	public void add(HttpServletRequest request, HttpServletResponse response) throws Exception {

		String idProduto = request.getParameter("id");

		String tipo = request.getParameter("tipo");

		String quantidade = request.getParameter("quantidade");

		String preco = request.getParameter("preco");

		add(idProduto, tipo, quantidade, preco);
		
		CarrinhoUtils.salvarCarrinho(response, this);
	}

	public void add(String idProduto, String tipo, String quantidade, String preco) throws Exception{
		
		ItemVenda itemVenda = this.getItem(idProduto, tipo);

		itemVenda.setPreco(Float.parseFloat(preco));

		itemVenda.setQuantidade(itemVenda.getQuantidade()
				+ Integer.parseInt(quantidade));
	}

	public void remove(HttpServletRequest request, HttpServletResponse response) throws Exception {

		String produto = request.getParameter("id");

		String tipo = request.getParameter("tipo");

		ItemVenda itemVenda = this.getItem(produto, tipo);

		this.getItens().remove(itemVenda);
		
		CarrinhoUtils.salvarCarrinho(response, this);
	}

	public void finalizar(HttpServletResponse response, Pessoa cliente)throws Exception {
		TransactionVenda tr = new TransactionVenda();
		
		Venda venda = new Venda();
		
		Status status = new Status();
		status.setId(1);
		
		venda.setCliente((Cliente) cliente);
		venda.setItens(this.itens);
		venda.setData(new Date());
		venda.setTotal(this.getValorTotal());
		venda.setStatus(status);
		
		tr.inserir(venda);
		
		CarrinhoUtils.removerCarrinho(response, this);
	}

	protected ItemVenda getItem(String idProduto, String tipo) throws Exception {

		for (ItemVenda itemVenda : this.getItens()) {

			if (Produto.CONVENIENCIA.equals(tipo) && itemVenda.getItem().getConveniencia().getId() == Integer.parseInt(idProduto) ){

				return itemVenda;
			}
			else if(Produto.MEDICAMENTO.equals(tipo) &&itemVenda.getItem().getMedicamento().getId() == Integer.parseInt(idProduto)){
				return itemVenda;
			}
		}

		ItemVenda itemVenda = new ItemVenda();

		Item item = new Item();
		TransactionTipoItem trtp = new TransactionTipoItem();
		
		trtp.getTipoItem("nome", tipo);
		TipoItem tipoItem = trtp.getTipoItem();
		item.setTipoItem(tipoItem);

		if (Produto.MEDICAMENTO.equals(tipo)) {

			TransactionMedicamento trm = new TransactionMedicamento();

			Medicamento m = new Medicamento();

			m.setId(Integer.parseInt(idProduto));

			trm.obterMedicamento(m);

			item.setMedicamento(trm.getMedicamento());

		} else {

			TransactionConveniencia trc = new TransactionConveniencia();

			Conveniencia c = new Conveniencia();

			c.setId(Integer.parseInt(idProduto));

			trc.obterConveniencia(c);

			item.setConveniencia(trc.getConveniencia());
		}

		itemVenda.setItem(item);

		this.getItens().add(itemVenda);

		return itemVenda;
	}
}
